package com.example.smartwaterapi.common.api;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 统一RESTful API响应格式
 *
 * @param <T> 响应数据类型
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RestApiResponse<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * HTTP状态码
     */
    private int status;

    /**
     * 业务状态码
     */
    private String code;

    /**
     * 响应消息
     */
    private String message;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 响应时间戳
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;

    /**
     * 请求路径
     */
    private String path;

    /**
     * 私有构造方法
     */
    private RestApiResponse() {
        this.timestamp = LocalDateTime.now();
    }

    /**
     * 构造方法
     *
     * @param status  HTTP状态码
     * @param code    业务状态码
     * @param message 响应消息
     * @param data    响应数据
     */
    private RestApiResponse(int status, String code, String message, T data) {
        this();
        this.status = status;
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应（200 OK）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> ok() {
        return new RestApiResponse<>(HttpStatus.OK.value(), "200", "操作成功", null);
    }

    /**
     * 成功响应（200 OK）
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> ok(T data) {
        return new RestApiResponse<>(HttpStatus.OK.value(), "200", "操作成功", data);
    }

    /**
     * 成功响应（200 OK）
     *
     * @param message 响应消息
     * @param data    响应数据
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> ok(String message, T data) {
        return new RestApiResponse<>(HttpStatus.OK.value(), "200", message, data);
    }

    /**
     * 创建成功响应（201 Created）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> created() {
        return new RestApiResponse<>(HttpStatus.CREATED.value(), "201", "创建成功", null);
    }

    /**
     * 创建成功响应（201 Created）
     *
     * @param data 响应数据
     * @param <T>  数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> created(T data) {
        return new RestApiResponse<>(HttpStatus.CREATED.value(), "201", "创建成功", data);
    }

    /**
     * 创建成功响应（201 Created）
     *
     * @param message 响应消息
     * @param data    响应数据
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> created(String message, T data) {
        return new RestApiResponse<>(HttpStatus.CREATED.value(), "201", message, data);
    }

    /**
     * 无内容响应（204 No Content）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> noContent() {
        return new RestApiResponse<>(HttpStatus.NO_CONTENT.value(), "204", "无内容", null);
    }

    /**
     * 错误请求响应（400 Bad Request）
     *
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> badRequest(String message) {
        return new RestApiResponse<>(HttpStatus.BAD_REQUEST.value(), "400", message, null);
    }

    /**
     * 未授权响应（401 Unauthorized）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> unauthorized() {
        return new RestApiResponse<>(HttpStatus.UNAUTHORIZED.value(), "401", "未授权", null);
    }

    /**
     * 未授权响应（401 Unauthorized）
     *
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> unauthorized(String message) {
        return new RestApiResponse<>(HttpStatus.UNAUTHORIZED.value(), "401", message, null);
    }

    /**
     * 禁止访问响应（403 Forbidden）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> forbidden() {
        return new RestApiResponse<>(HttpStatus.FORBIDDEN.value(), "403", "禁止访问", null);
    }

    /**
     * 禁止访问响应（403 Forbidden）
     *
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> forbidden(String message) {
        return new RestApiResponse<>(HttpStatus.FORBIDDEN.value(), "403", message, null);
    }

    /**
     * 资源不存在响应（404 Not Found）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> notFound() {
        return new RestApiResponse<>(HttpStatus.NOT_FOUND.value(), "404", "资源不存在", null);
    }

    /**
     * 资源不存在响应（404 Not Found）
     *
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> notFound(String message) {
        return new RestApiResponse<>(HttpStatus.NOT_FOUND.value(), "404", message, null);
    }

    /**
     * 服务器错误响应（500 Internal Server Error）
     *
     * @param <T> 数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> error() {
        return new RestApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), "500", "服务器错误", null);
    }

    /**
     * 服务器错误响应（500 Internal Server Error）
     *
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> error(String message) {
        return new RestApiResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), "500", message, null);
    }

    /**
     * 自定义业务错误响应（使用HTTP 200状态码，但业务状态码表示错误）
     *
     * @param code    业务状态码
     * @param message 错误消息
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> businessError(String code, String message) {
        return new RestApiResponse<>(HttpStatus.OK.value(), code, message, null);
    }

    /**
     * 自定义业务错误响应（使用HTTP 200状态码，但业务状态码表示错误）
     *
     * @param code    业务状态码
     * @param message 错误消息
     * @param data    错误数据
     * @param <T>     数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> businessError(String code, String message, T data) {
        return new RestApiResponse<>(HttpStatus.OK.value(), code, message, data);
    }

    /**
     * 自定义状态响应
     *
     * @param httpStatus HTTP状态码
     * @param code       业务状态码
     * @param message    响应消息
     * @param data       响应数据
     * @param <T>        数据类型
     * @return RestApiResponse
     */
    public static <T> RestApiResponse<T> custom(HttpStatus httpStatus, String code, String message, T data) {
        return new RestApiResponse<>(httpStatus.value(), code, message, data);
    }

    /**
     * 设置请求路径
     *
     * @param path 请求路径
     * @return RestApiResponse
     */
    public RestApiResponse<T> path(String path) {
        this.path = path;
        return this;
    }
} 